/**
 * @file personne.h
 * @brief Fichier d'entête du module personne.
 *
 * @author Rachid Delory, Mamadou Keita, Florian Bernard
 */

#ifndef H_PERSONNE_H
#define H_PERSONNE_H

/* *********************************************************************

                       Librairies de personne                           

********************************************************************* */

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include "pays.h"
#include "date.h"
#include "utilitaireString.h"

/* *********************************************************************

                        Définitions de types                           

********************************************************************* */

/**
 * @struct sPersonne
 * @brief Structure utilisée pour la gestion des Personne
 *
 * Cette structure est utilisée pour gérer un Personne. Les champs de cette structure doivent être modifiés ou lus par les accesseurs et mutateurs. Ils doivent être initialisés et libérés avec les fonctions prévus à cette effet
 */
struct sPersonne {
  unsigned int id; /** */
  Pays * pays; /** */
  char * nom; /** */
  char * prenom; /** */
  char * nomScene; /** */
  Date * dateNaissance; /** */
  char * lieuxNaissance; /** */
  Date * dateDeces; /** */
  char * site; /** */
  char * biographie; /** */
  char maj;
  char sup;
};
/**
 * @typedef Personne
 * @brief Redéfinit la structure sPersonne
 */
	typedef struct sPersonne Personne;

/* *********************************************************************

           Accesseurs et Mutateurs de la structure Personne               

********************************************************************* */
/**
 * @fn Personne * creer_Per() ;
 * @brief Crée une date dans le tas
 *
 * @return un pointeur sur Personne
 */
void * creer_Per();

/**
 * @fn void init_Per(Personne * date);
 * @brief Initilise une date
 *
 * @param[in,out] Personne pointeur sur Personne
 */
void init_Per(Personne * date);

/**
 * @fn void liberer_Per(Personne * date);
 * @brief Libère la date
 *
 * @param[in,out] date pointeur sur Personne
 */
void liberer_Per(Personne * date);

/**
 * @fn void detruire_Per(Personne ** date);
 * @brief Détruis une date du tas
 * 
 * @param[in,out] date pointeur sur Personne
 */
void detruire_Per(Personne ** date);

/**
 * @fn void copier_Per(Personne *dest, const Personne *src);
 * @brief Copie dans dest le Personne src
 *
 * @param[in,out] dest contiendra les mêmes infor que src
 * @param src
 */
void copier_Per(Personne **dest, const Personne *src);

/**
 * @fn unsigned int getId_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return unsigned int
 */
unsigned int getId_Per(const Personne * ptr) ;

/**
 * @fn void setId_Per(Personne *ptr, const unsigned int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setId_Per(Personne *ptr, const unsigned int val) ;

/**
 * @fn Pays * getPays_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return Pays *
 */
Pays * getPays_Per(const Personne * ptr) ;

/**
 * @fn void setPays_Per(Personne *ptr, const Pays * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setPays_Per(Personne *ptr, const Pays * val) ;

/**
 * @fn char * getNom_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return char *
 */
char * getNom_Per(const Personne * ptr) ;

/**
 * @fn void setNom_Per(Personne *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setNom_Per(Personne *ptr, const char * val) ;

/**
 * @fn char * getPrenom_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return char *
 */
char * getPrenom_Per(const Personne * ptr) ;

/**
 * @fn void setPrenom_Per(Personne *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setPrenom_Per(Personne *ptr, const char * val) ;

/**
 * @fn char * getNomScene_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return char *
 */
char * getNomScene_Per(const Personne * ptr) ;

/**
 * @fn void setNomScene_Per(Personne *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setNomScene_Per(Personne *ptr, const char * val) ;

/**
 * @fn Date * getDateNaissance_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return Date *
 */
Date * getDateNaissance_Per(const Personne * ptr) ;

/**
 * @fn void setDateNaissance_Per(Personne *ptr, const Date * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setDateNaissance_Per(Personne *ptr, const Date * val) ;

/**
 * @fn char * getLieuxNaissance_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return char *
 */
char * getLieuxNaissance_Per(const Personne * ptr) ;

/**
 * @fn void setLieuxNaissance_Per(Personne *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setLieuxNaissance_Per(Personne *ptr, const char * val) ;

/**
 * @fn Date * getDateDeces_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return Date *
 */
Date * getDateDeces_Per(const Personne * ptr) ;

/**
 * @fn void setDateDeces_Per(Personne *ptr, const Date * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setDateDeces_Per(Personne *ptr, const Date * val) ;

/**
 * @fn char * getSite_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return char *
 */
char * getSite_Per(const Personne * ptr) ;

/**
 * @fn void setSite_Per(Personne *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setSite_Per(Personne *ptr, const char * val) ;

/**
 * @fn char * getBiographie_Per(const Personne * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Personne
 * @return char *
 */
char * getBiographie_Per(const Personne * ptr) ;

/**
 * @fn void setBiographie_Per(Personne *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Personne.
 * @param val.
 */
void setBiographie_Per(Personne *ptr, const char * val) ;

/**
 * @fn void setMaj_Per(Personne *ptr, const char b);
 * @brief Set le besoin de faire une mise à jour, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setMaj_Per(Personne *ptr, const char b);

/**
 * @fn char getMaj_Per(const Personne *ptr);
 * @brief Retourne 0 si pas besoin de faire la mise à jour, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getMaj_Per(const Personne *ptr);

/**
 * @fn void setSup_Per(Personne *ptr, const char b);
 * @brief Set le besoin de le supprimer, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setSup_Per(Personne *ptr, const char b);

/**
 * @fn char getSup_Per(const Personne *ptr);
 * @brief Retourne 0 si pas besoin de le supprimer, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getSup_Per(const Personne *ptr);

#endif
